過於頻繁訪問伺服器,會造成伺服器負擔,這時必須使用middleware來阻擋,在尚未訪問到資料前,就阻擋
創建一個資料夾middleware與app同級
middleware底下創建mymiddleware.py
mymiddleware.py
from django.core.cache import cache
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
ip = request.META.get('REMOTE_ADDR')
if request.path == '/app/test/':
result = cache.get(ip)
if result:
return HttpResponse('請10秒後在試')
cache.set(ip, ip, timeout=10)
setting.py註冊自訂的middleware
MIDDLEWARE = [
'middleware.mymiddleware.MyMiddleware',
單純的靜態網頁比較不需要什麼加載時間,對伺服器消耗也較少,但是如果試搜尋可能消耗就會比較多
def process_request(self, request):是固定用法
request.META打印出來會是許多關於網頁的資訊,像是'REMOTE_ADDR',CONTENT_TYPE,user-agent...
request.path要的是需要添加黑名單的網址(不是所有網頁都需要黑名單),也就是127.0.0.1:8000後面的那串
那更好的方法是一分鐘不能訪問超過n次,因為使用者總是會覺得加載速度很慢,就一直刷新
一開始先確定該ip是否有來訪問過
沒有就為該ip建一個陣列,來存取時間(time.time())
有就使用快取上紀錄ip的arr,
當現在時間減去陣列中的時間,大於60就會將陣列的值pop出來
if request.path == '/app/test/':
arr = []
if cache.get(ip):
arr = cache.get(ip)
while arr and time.time()-arr[-1] > 60:
arr.pop()
arr.append(time.time())
cache.set(ip, arr, timeout=60)
print(arr)
if len(arr) > 10:
return HttpResponse('請求過於頻繁,請一分鐘後在試')
在新增一些東西就變成黑名單啦
一開始不知道是否有黑名單在快取中,所以要先創建一個black_list,如果有就用原有的black_list
if len(arr) > 20:
black_list.append(ip)
cache.set('black_list', black_list, timeout=60*10)
如果已經告知"請求過於頻繁,請一分鐘後在試",還是繼續訪問,就會將該ip添加到黑名單中
if request.path == '/app/test/':
black_list = []
if cache.get('black_list'):
black_list = cache.get('black_list')
if ip in black_list:
return HttpResponse('10分鐘禁止訪問')
arr = []
if cache.get(ip):
arr = cache.get(ip)
while arr and time.time()-arr[-1] > 60:
arr.pop()
arr.append(time.time())
cache.set(ip, arr, timeout=60)
if len(arr) > 20:
black_list.append(ip)
cache.set('black_list', black_list, timeout=60*10)
print(arr)
if len(arr) > 10:
return HttpResponse('請求過於頻繁,請一分鐘後在試')